import java.util.*;
import entities.*;
import ejbs.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Main {

	public static void main(String[] args) throws NamingException {

		String naming= "TPEAR/FacadeBean/remote";
		Hashtable props=new Hashtable();
		props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
		InitialContext ic = new InitialContext(props);
		Facade f = (Facade)ic.lookup(naming);
		
		// 0 - Crear algunos productos
		crearProductosDePrueba(f);
		pruebaObtenerProducto(f);
		
		// 1 - Solicitar Cotizacion (sincronico)
		pruebaSolicitarCotizacion(f);
		pruebaObtenerSolicitudesDeCotizacion(f);
		pruebaObtenerCotizaciones(f);
		
		// 2 - Generar Solicitud de Compra
		pruebaSolicitarCompra(f);
		pruebaObtenerSolicitudesDeCompra(f);
		
		// 3 - Recibir Factura (asincronico)
		pruebaObtenerFacturasRecibidas(f);
		
		// 4 - Recibir Datos de Producto
		pruebaObtenerDatosRecibidos(f);
	}
	
	private static void crearProductosDePrueba(Facade f) {
		
		ArrayList<Producto> articulos = f.obtenerArticulos();
		if (articulos.size() == 0)
		{		
			f.crearArticulo("A1", "caract A1", "marca A1", "origen A1", "tipo A1", "cod prop A1");
			f.crearArticulo("A2", "caract A2", "marca A2", "origen A2", "tipo A2", "cod prop A2");
			f.crearArticulo("A3", "caract A3", "marca A3", "origen A3", "tipo A3", "cod prop A3");
			f.crearArticulo("A4", "caract A4", "marca A4", "origen A4", "tipo A4", "cod prop A4");
			f.crearArticulo("A5", "caract A5", "marca A5", "origen A5", "tipo A5", "cod prop A5");
		}
		
		articulos = f.obtenerArticulos();
		
		System.out.println("Productos creados:");
		for (int i = 0; i < articulos.size(); i++) {
			Producto a = articulos.get(i);
			mostrarArticulo(a);
		}		
		mostrarSeparador();
	}
	
	private static void mostrarArticulo(Producto a)
	{
		System.out.println(a.getCodigo() + " " +
				a.getCaracteristica() + " " +
				a.getMarca() + " " +
				a.getOrigen() + " " +
				a.getTipo() + " " +
				a.getCod_propietario());
	}
	
	private static void mostrarSolicitudCotizacion(SolicitudCotizacion solicitudCotizacion)
	{
		System.out.println("Solicitud Cotizacion id: " + solicitudCotizacion.getId()
				+ " items: " + solicitudCotizacion.getItemsACotizar().size());
		Iterator<ItemACotizar> itr = solicitudCotizacion.getItemsACotizar().iterator(); 
		while (itr.hasNext()) {
			ItemACotizar item = itr.next();
			System.out.println("cod: " + item.getCodigo() + " cant: " + item.getCantidad());
		}
	}
	
	private static void mostrarCotizacion(Cotizacion cotizacion)
	{
		System.out.println("Cotizacion id: " + cotizacion.getId()
				+ " items: " + cotizacion.getItemsCotizados().size()
				+ " vigencia: " + cotizacion.getVigencia());
		Iterator<ItemCotizado> itr = cotizacion.getItemsCotizados().iterator(); 
		while (itr.hasNext()) {
			ItemCotizado item = itr.next();
			System.out.println("cod: " + item.getCodigo() 
					+ " cant: " + item.getCantidad()
					+ " precio: $" + item.getPrecio());
		}
	}
	
	private static void mostrarSolicitudCompra(SolicitudCompra solicitudCompra)
	{
		System.out.println("Solicitud Compra id: " + solicitudCompra.getId()
				+ " items: " + solicitudCompra.getItemsAComprar().size());
		Iterator<ItemAComprar> itr = solicitudCompra.getItemsAComprar().iterator(); 
		while (itr.hasNext()) {
			ItemAComprar item = itr.next();
			System.out.println("cod: " + item.getCodigo() + " cant: " + item.getCantidad());
		}
	}
	
	private static void mostrarFactura(Factura factura) {
		System.out.println("Factura id: " + factura.getId()
				+ " items: " + factura.getItemsFacturados().size()
				+ " fecha: " + factura.getFecha());
		Iterator<ItemFacturado> itr = factura.getItemsFacturados().iterator(); 
		while (itr.hasNext()) {
			ItemFacturado item = itr.next();
			System.out.println("cod: " + item.getCodigo() 
					+ " cant: " + item.getCantidad()
					+ " precio: $" + item.getPrecio());
		}
	}

	private static void mostrarSeparador()
	{
		System.out.println("---------------------------");
		System.out.println("");
	}
	
	private static void pruebaObtenerProducto(Facade f) {

		System.out.println("Obteniendo articulo A3:");		
		Producto a = f.obtenerArticulo("A3");
		mostrarArticulo(a);
		mostrarSeparador();
	}
	
	private static void pruebaSolicitarCotizacion(Facade f) {
		
		System.out.println("Solicitando una cotizacion...");
		SolicitudCotizacion solicitudCotizacion = new SolicitudCotizacion();
		
		ItemACotizar item1 = new ItemACotizar();
		item1.setCodigo("A2");
		item1.setCantidad(5);
		item1.setSolicitudCotizacion(solicitudCotizacion);
		
		ItemACotizar item2 = new ItemACotizar();
		item2.setCodigo("A4");
		item2.setCantidad(8);
		item2.setSolicitudCotizacion(solicitudCotizacion);
		
		solicitudCotizacion.getItemsACotizar().add(item1);
		solicitudCotizacion.getItemsACotizar().add(item2);
		
		f.cotizar(solicitudCotizacion);
		
		System.out.println("Solicitud de cotizacion creada!");
		
		mostrarSeparador();
	}
	
	private static void pruebaObtenerSolicitudesDeCotizacion(Facade f) {
		
		System.out.println("Solicitudes de cotizacion creadas:");
		
		ArrayList<SolicitudCotizacion> solicitudesCotizacion = f.obtenerSolicitudesCotizacion();
		
		Iterator<SolicitudCotizacion> itr = solicitudesCotizacion.iterator();
		while (itr.hasNext()) {
			SolicitudCotizacion solicitudCotizacion = itr.next();
			mostrarSolicitudCotizacion(solicitudCotizacion);
			System.out.println("   ---   ");
		}
		mostrarSeparador();		
	}

	private static void pruebaObtenerCotizaciones(Facade f) {
		
		System.out.println("Cotizacion creadas:");
		
		ArrayList<Cotizacion> cotizaciones = f.obtenerCotizaciones();
		
		Iterator<Cotizacion> itr = cotizaciones.iterator();
		while (itr.hasNext()) {
			Cotizacion cotizacion = itr.next();
			mostrarCotizacion(cotizacion);
			System.out.println("   ---   ");
		}
		mostrarSeparador();		
	}
	
	private static void pruebaSolicitarCompra(Facade f) {
		
		System.out.println("Solicitando una compra...");
		SolicitudCompra solicitudCompra = new SolicitudCompra();
		
		ItemAComprar item1 = new ItemAComprar();
		item1.setCodigo("A1");
		item1.setCantidad(2);
		item1.setSolicitudCompra(solicitudCompra);
		ItemAComprar item2 = new ItemAComprar();
		item2.setCodigo("A2");
		item2.setCantidad(4);
		item2.setSolicitudCompra(solicitudCompra);
		ItemAComprar item3 = new ItemAComprar();
		item3.setCodigo("A3");
		item3.setCantidad(6);
		item3.setSolicitudCompra(solicitudCompra);

		solicitudCompra.getItemsAComprar().add(item1);
		solicitudCompra.getItemsAComprar().add(item2);
		solicitudCompra.getItemsAComprar().add(item3);
		
		f.solicitarCompra(solicitudCompra);
		
		System.out.println("Solicitud de compra creada!");
		
		mostrarSeparador();
	}
	
	private static void pruebaObtenerSolicitudesDeCompra(Facade f) {

		System.out.println("Solicitudes de compra creadas:");
		
		ArrayList<SolicitudCompra> solicitudesCompra = f.obtenerSolicitudesCompra();
		
		Iterator<SolicitudCompra> itr = solicitudesCompra.iterator();
		while (itr.hasNext()) {
			SolicitudCompra solicitudCompra = itr.next();
			mostrarSolicitudCompra(solicitudCompra);
			System.out.println("   ---   ");
		}
		mostrarSeparador();	
	}

	private static void pruebaObtenerFacturasRecibidas(Facade f) {
		
		System.out.println("Facturas recibidas:");
		
		ArrayList<Factura> facturas = f.obtenerFacturasRecibidas();
		
		Iterator<Factura> itr = facturas.iterator();
		while (itr.hasNext()) {
			Factura factura = itr.next();
			mostrarFactura(factura);
			System.out.println("   ---   ");
		}
		mostrarSeparador();	
		
	}

	private static void pruebaObtenerDatosRecibidos(Facade f) {

		
	}


}
